home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / lightning-0.8-tb-win.xpi / chrome / calendar.jar / content / calendar / calendar-minimonth-busy.js < prev    next >
Text File  |  2008-02-08  |  8KB  |  216 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Minimonth Busy Highlighter code.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  *   Philipp Kewisch <mozilla@kewis.ch>
  18.  * Portions created by the Initial Developer are Copyright (C) 2007
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. /* NOTE: This script requires functions from calUtils.js, calendar-views.js
  38.  *        and also the getCompositeCalendar() function which is target app
  39.  *        dependant.
  40.  */
  41.  
  42. var minimonthBusyListener = {
  43.     QueryInterface: function mBL_QueryInterface(aIID) {
  44.         if (!aIID.equals(Components.interfaces.calIOperationListener) &&
  45.             !aIID.equals(Components.interfaces.calICompositeObserver) &&
  46.             !aIID.equals(Components.interfaces.calIObserver) &&
  47.             !aIID.equals(Components.interfaces.nsISupports)) {
  48.             throw Components.results.NS_ERROR_NO_INTERFACE;
  49.         }
  50.         return this;
  51.     },
  52.  
  53.     // calIOperationListener methods
  54.     onOperationComplete: function mBL_onOperationComplete(aCalendar,
  55.                                                           aStatus,
  56.                                                           aOperationType,
  57.                                                           aId,
  58.                                                           aDetail) {},
  59.  
  60.     onGetResult: function mBL_onGetResult(aCalendar,
  61.                                           aStatus,
  62.                                           aItemType,
  63.                                           aDetail,
  64.                                           aCount,
  65.                                           aItems) {
  66.         if (!Components.isSuccessCode(aStatus)) {
  67.             return;
  68.         }
  69.  
  70.         for each (var item in aItems) {
  71.             this.setBusyDaysForOccurrence(item, true);
  72.         }
  73.     },
  74.  
  75.     setBusyDaysForItem: function mBL_setBusyDaysForItem(aItem, aState) {
  76.         var minimonth = getMinimonth();
  77.         var items = [aItem];
  78.  
  79.         if (aItem.recurrenceInfo) {
  80.             var startDate = jsDateToDateTime(minimonth.firstDate);
  81.             var endDate = jsDateToDateTime(minimonth.lastDate);
  82.             items = aItem.getOccurrencesBetween(startDate, endDate, {});
  83.         }
  84.  
  85.         for each (var item in items) {
  86.             this.setBusyDaysForOccurrence(item, aState);
  87.         }
  88.     },
  89.  
  90.     setBusyDaysForOccurrence: function mBL_setBusyDaysForOccurrence(aOccurrence,
  91.                                                                     aState) {
  92.         if (aOccurrence.getProperty("TRANSP") == "TRANSPARENT") {
  93.           // Skip transparent events
  94.           return;
  95.         }
  96.  
  97.         var minimonth = getMinimonth();
  98.         var start = aOccurrence.startDate ||
  99.                     aOccurrence.entryDate ||
  100.                     aOccurrence.dueDate;
  101.         var end = aOccurrence.endDate || aOccurrence.dueDate || start;
  102.         if (!start) {
  103.             return;
  104.         }
  105.  
  106.         // We need to compare with midnight of the current day, so reset the
  107.         // time here.
  108.         var current = start.clone();
  109.         current.hour = 0;
  110.         current.minute = 0;
  111.         current.second = 0;
  112.  
  113.         // Cache the result so the compare isn't called in each iteration.
  114.         var compareResult = (start.compare(end) == 0 ? 1 : 0);
  115.  
  116.         // Setup the busy days.
  117.         while (current.compare(end) < compareResult) {
  118.             var box = minimonth.getBoxForDate(current.jsDate);
  119.             if (box) {
  120.                 var n = parseInt(box.getAttribute("busy") || 0) +
  121.                         (aState ? 1 : -1);
  122.                 if (n > 0) {
  123.                     box.setAttribute("busy", n);
  124.                 } else {
  125.                     box.removeAttribute("busy");
  126.                 }
  127.             }
  128.  
  129.             current.day++;
  130.         }
  131.     },
  132.  
  133.     // calIObserver methods
  134.     onStartBatch: function mBL_onStartBatch() {},
  135.  
  136.     onEndBatch: function mBL_onEndBatch() {},
  137.  
  138.     onLoad: function mBL_onLoad(aCalendar) {},
  139.  
  140.     onAddItem: function mBL_onAddItem(aItem) {
  141.         this.setBusyDaysForItem(aItem, true);
  142.     },
  143.  
  144.     onDeleteItem: function mBL_onDeleteItem(aItem) {
  145.         this.setBusyDaysForItem(aItem, false);
  146.     },
  147.  
  148.     onModifyItem: function mBL_onModifyItem(aNewItem, aOldItem) {
  149.         this.setBusyDaysForItem(aOldItem, false);
  150.         this.setBusyDaysForItem(aNewItem, true);
  151.     },
  152.  
  153.     onError: function mBL_onError(aErrNo, aMessage) {},
  154.  
  155.     onPropertyChanged: function(aCalendar, aName, aValue, aOldValue) {},
  156.  
  157.     onPropertyDeleting: function(aCalendar, aName) {},
  158.  
  159.     // calICompositeObserver methods
  160.     onCalendarAdded: function mBL_onCalendarAdded(aCalendar) {
  161.         var minimonth = getMinimonth();
  162.         minimonth.resetAttributesForDate();
  163.         monthChangeListener({ target: minimonth });
  164.     },
  165.  
  166.     onCalendarRemoved: function mBL_onCalendarRemoved(aCalendar) {
  167.         var minimonth = getMinimonth();
  168.         minimonth.resetAttributesForDate();
  169.         monthChangeListener({ target: minimonth });
  170.     },
  171.  
  172.     onDefaultCalendarChanged: function mBL_onDefaultCalendarChanged(aNew) {}
  173. };
  174.  
  175. function monthChangeListener(event) {
  176.     // The minimonth automatically clears extra styles on a month change.
  177.     // Therefore we only need to fill the minimonth with new info.
  178.     var start = event.target.firstDate;
  179.     var end = event.target.lastDate;
  180.  
  181.     var composite = getCompositeCalendar();
  182.     var filter = composite.ITEM_FILTER_COMPLETED_ALL |
  183.                  composite.ITEM_FILTER_CLASS_OCCURRENCES |
  184.                  composite.ITEM_FILTER_ALL_ITEMS;
  185.  
  186.     // Get new info
  187.     composite.getItems(filter,
  188.                        0,
  189.                        jsDateToDateTime(start),
  190.                        jsDateToDateTime(end),
  191.                        minimonthBusyListener);
  192. }
  193.  
  194. function minimonthOnLoad() {
  195.     var minimonth = getMinimonth();
  196.     // This might be the hidden window, which has no UI
  197.     if (minimonth) {
  198.         minimonth.addEventListener("monthchange", monthChangeListener, false);
  199.         monthChangeListener({ target: minimonth });
  200.         getCompositeCalendar().addObserver(minimonthBusyListener);
  201.     }
  202. }
  203.  
  204. function minimonthOnUnload() {
  205.     var minimonth = getMinimonth();
  206.     // This might be the hidden window, which has no UI
  207.     if (minimonth) {
  208.         minimonth.removeEventListener("monthchange", monthChangeListener, false);
  209.         monthChangeListener({ target: minimonth });
  210.         getCompositeCalendar().removeObserver(minimonthBusyListener);
  211.     }
  212. }
  213.  
  214. window.addEventListener("load", minimonthOnLoad, false);
  215. window.addEventListener("unload", minimonthOnUnload, false);
  216.